/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.db.SqlManager;
import com.exception.DataException;
import com.javabeans.Departamento;
import com.javabeans.Facultad;
/**
 * @author Administrador
 */
public class AdminFacultad implements FacultadManager{
    private Connection c;

    public AdminFacultad(Connection c){
        this.c = c;
    }
    
    @Override
    public int getIdFacultad() throws DataException {
        int res = 0;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT IFNULL(max(IDFACULTAD)+1,1) AS ID FROM FACULTAD";
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            rs.next();
            res = rs.getInt("ID");
        }catch(SQLException e){
            throw new DataException(" AdminFacultad -> getIdFacultad() "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }

    @Override
    public void saveFacultad(Facultad f) throws DataException {
        PreparedStatement preSt = null;
        String query = "";
        try{
            query="INSERT INTO FACULTAD VALUES("+f.getIdFacultad();
            query+= ", '"+f.getNombre().toUpperCase();
            query+= "', '"+f.getSigla().toUpperCase();
            query+= "', '"+f.getTelefono().toUpperCase();
            query+= "', '"+f.getDireccion().toUpperCase()+"',"+f.isActivo()+","+f.getIdDepartamento()+")";            
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminFacultad -> saveFacultad(Facultad f) "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    @Override
    public List<Facultad> getFacultades() throws DataException{
        List<Facultad> facultades = new ArrayList<Facultad>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT F.IDFACULTAD, F.NOMBRE, F.SIGLA, F.TELEFONO, F.DIRECCION";
            query += ", D.IDDEPARTAMENTO, D.NOMBRE, D.SIGLA";
            query += " FROM FACULTAD F";
            query += " INNER JOIN DEPARTAMENTO D ON F.IDDEPARTAMENTO=D.IDDEPARTAMENTO";
            query += " WHERE F.ACTIVO=1";
            query += " ORDER BY D.NOMBRE, F.NOMBRE";            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Departamento d = new Departamento();
                d.setIdDepartamento(rs.getInt("D.IDDEPARTAMENTO"));
                d.setNombre(rs.getString("D.NOMBRE"));
                d.setSigla(rs.getString("D.SIGLA"));
                
                Facultad f = new Facultad();
                f.setIdFacultad(rs.getInt("F.IDFACULTAD"));
                f.setNombre(rs.getString("F.NOMBRE"));
                f.setSigla(rs.getString("F.SIGLA"));
                f.setTelefono(rs.getString("F.TELEFONO"));
                f.setDireccion(rs.getString("F.DIRECCION"));
                f.setDepartamento(d);
                facultades.add(f);
            }
        }catch(SQLException e){
            throw new DataException(" AdminFacultad -> getFacultades() e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return facultades;
    }
    
    @Override
    public List<Facultad> getFacultadesInactivos() throws DataException{
        List<Facultad> facultades = new ArrayList<Facultad>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT F.IDFACULTAD, F.NOMBRE, F.SIGLA, F.TELEFONO, F.DIRECCION";
            query += ", D.IDDEPARTAMENTO, D.NOMBRE, D.SIGLA";
            query += " FROM FACULTAD F";
            query += " INNER JOIN DEPARTAMENTO D ON F.IDDEPARTAMENTO=D.IDDEPARTAMENTO";
            query += " WHERE F.ACTIVO=0";
            query += " ORDER BY D.NOMBRE, F.NOMBRE";            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Departamento d = new Departamento();
                d.setIdDepartamento(rs.getInt("D.IDDEPARTAMENTO"));
                d.setNombre(rs.getString("D.NOMBRE"));
                d.setSigla(rs.getString("D.SIGLA"));
                
                Facultad f = new Facultad();
                f.setIdFacultad(rs.getInt("F.IDFACULTAD"));
                f.setNombre(rs.getString("F.NOMBRE"));
                f.setSigla(rs.getString("F.SIGLA"));
                f.setTelefono(rs.getString("F.TELEFONO"));
                f.setDireccion(rs.getString("F.DIRECCION"));
                f.setDepartamento(d);
                facultades.add(f);
            }
        }catch(SQLException e){
            throw new DataException(" AdminFacultad -> getFacultadesInactivos() e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return facultades;
    }
    
    @Override
    public Facultad getFacultad(int idFacultad) throws DataException{
        Facultad f = new Facultad();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT F.IDFACULTAD, F.NOMBRE, F.SIGLA, F.TELEFONO, F.DIRECCION, F.ACTIVO";
            query += ", D.IDDEPARTAMENTO, D.NOMBRE, D.SIGLA";
            query += " FROM FACULTAD F";
            query += " INNER JOIN DEPARTAMENTO D ON F.IDDEPARTAMENTO=D.IDDEPARTAMENTO";
            query += " WHERE F.IDFACULTAD="+idFacultad;            ;
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Departamento d = new Departamento();
                d.setIdDepartamento(rs.getInt("D.IDDEPARTAMENTO"));
                d.setNombre(rs.getString("D.NOMBRE"));
                d.setSigla(rs.getString("D.SIGLA"));
                
                f.setIdFacultad(rs.getInt("F.IDFACULTAD"));
                f.setNombre(rs.getString("F.NOMBRE"));
                f.setSigla(rs.getString("F.SIGLA"));
                f.setTelefono(rs.getString("F.TELEFONO"));
                f.setDireccion(rs.getString("F.DIRECCION"));
                f.setDepartamento(d);
                f.setActivo(rs.getBoolean("F.ACTIVO"));
            }
        }catch(SQLException e){
            throw new DataException(" AdminFacultad -> getFacultad() e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return f;
    }
    
    @Override
    public void updateFacultad(Facultad f) throws DataException {
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE FACULTAD SET NOMBRE = '"+f.getNombre().toUpperCase();
            query+= "', SIGLA = '"+f.getSigla().toUpperCase();
            query+= "', TELEFONO = '"+f.getTelefono().toUpperCase();
            query+= "', DIRECCION = '"+f.getDireccion().toUpperCase();
            query+= "' WHERE IDFACULTAD="+f.getIdFacultad();            
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminFacultad -> updateFacultad(Facultad f) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    @Override
    public void deleteFacultad(int idFacultad) throws DataException {
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "";
        try{
            query = "SELECT C.IDCARRERA";
            query += " FROM FACULTAD F, CARRERA C";
            query += " WHERE F.IDFACULTAD=C.IDFACULTAD";
            query += " AND F.IDFACULTAD="+idFacultad;
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                query = "DELETE FROM MATERIA WHERE IDCARRERA="+rs.getInt("C.IDCARRERA");
                preSt = c.prepareStatement(query);
                preSt.executeUpdate();
                
                query = "DELETE FROM CARRERA WHERE IDCARRERA="+rs.getInt("C.IDCARRERA");
                preSt = c.prepareStatement(query);
                preSt.executeUpdate();
            }
            query = "DELETE FROM FACULTAD WHERE IDFACULTAD="+idFacultad;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException e){
            throw new DataException(" AdminFacultad -> deleteFacultad(idFacultad) query ====== "+query+" e = "+e.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    public boolean isUseFacultadForDelete(int idFacultad) throws DataException{
        boolean res = false;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT F.IDFACULTAD";
        query += " FROM FACULTAD F";
        query += ", CARRERA C, MATERIA M, INSCRITO I";
        query += " WHERE F.IDFACULTAD=C.IDFACULTAD";
        query += " AND C.IDCARRERA=M.IDCARRERA";
        query += " AND M.IDCARRERA=I.IDCARRERA AND M.IDMATERIA=I.IDMATERIA";
        query += " LIMIT 1";
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            if(rs.next())
                res = true;
        }catch(SQLException e){
            throw new DataException(" AdminFacultad -> isUseFacultadForDelete() "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }
    
    public void darBaja(int idFacultad) throws DataException{
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "";
        try{
            query = "SELECT C.IDCARRERA";
            query += " FROM FACULTAD F, CARRERA C";
            query += " WHERE F.IDFACULTAD=C.IDFACULTAD";
            query += " AND F.IDFACULTAD="+idFacultad;
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                query = "UPDATE CARRERA SET ACTIVO = 0 WHERE IDCARRERA="+rs.getInt("C.IDCARRERA");
                preSt = c.prepareStatement(query);
                preSt.executeUpdate();
                query = "UPDATE MATERIA SET ACTIVO = 0 WHERE IDCARRERA="+rs.getInt("C.IDCARRERA");
                preSt = c.prepareStatement(query);
                preSt.executeUpdate();
            }
            query = "UPDATE FACULTAD SET ACTIVO = 0 WHERE IDFACULTAD="+idFacultad;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminPais -> darBaja(int idFacultad) QUERY ========= "+query+" ========== e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    public void darAlta(int idFacultad) throws DataException{
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "";
        try{
            query = "SELECT C.IDCARRERA";
            query += " FROM FACULTAD F, CARRERA C";
            query += " WHERE F.IDFACULTAD=C.IDFACULTAD";
            query += " AND F.IDFACULTAD="+idFacultad;
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                query = "UPDATE CARRERA SET ACTIVO = 1 WHERE IDCARRERA="+rs.getInt("C.IDCARRERA");
                preSt = c.prepareStatement(query);
                preSt.executeUpdate();
                query = "UPDATE MATERIA SET ACTIVO = 1 WHERE IDCARRERA="+rs.getInt("C.IDCARRERA");
                preSt = c.prepareStatement(query);
                preSt.executeUpdate();
            }
            query = "UPDATE FACULTAD SET ACTIVO = 1 WHERE IDFACULTAD="+idFacultad;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminFacultad -> darAlta(int idFacultad) query ===== "+query+" ==== e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    @Override
    public Facultad getFacultadAdmin(int idUsuario) throws DataException {
        Facultad f = new Facultad();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT F.IDFACULTAD";
            query += ", F.NOMBRE";
            query += ", F.SIGLA";
            query += ", F.TELEFONO";
            query += ", F.DIRECCION";
            query += ", F.IDDEPARTAMENTO";
            query += ", D.NOMBRE";
            query += ", D.SIGLA";
            query += " FROM FACULTAD F";
            query += " INNER JOIN DETALLE_ADMINISTRATIVO DA ON F.IDFACULTAD=DA.IDFACULTAD";
            query += " INNER JOIN DEPARTAMENTO D ON F.IDDEPARTAMENTO=D.IDDEPARTAMENTO";
            query += " WHERE DA.IDDETALLE_ADMINISTRATIVO = "+idUsuario+" AND F.ACTIVO=1 AND D.ACTIVO=1 LIMIT 1";
             System.out.println(query);
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Departamento d = new Departamento();
                d.setIdDepartamento(rs.getInt("F.IDDEPARTAMENTO"));
                d.setNombre(rs.getString("D.NOMBRE"));
                d.setSigla(rs.getString("D.SIGLA"));
                
                f.setIdFacultad(rs.getInt("F.IDFACULTAD"));
                f.setNombre(rs.getString("F.NOMBRE"));
                f.setSigla(rs.getString("F.SIGLA"));
                f.setTelefono(rs.getString("F.TELEFONO"));
                f.setDireccion(rs.getString("F.DIRECCION"));
                f.setIdDepartamento(rs.getInt("F.IDDEPARTAMENTO"));
                f.setDepartamento(d);
            }
        }catch(SQLException e){
            throw new DataException(" AdminFacultad -> getFacultadAdmin() e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return f;
    }
    
    @Override
    public List<Facultad> getFacultadesPorDocente(int idDocente) throws DataException{
        List<Facultad> facultades = new ArrayList<Facultad>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT DISTINCT F.IDFACULTAD";
            query += ", F.NOMBRE, F.SIGLA";
            query += " FROM FACULTAD F";
            query += " INNER JOIN (CARRERA C INNER JOIN CARRERA_DOCENTE CD ON C.IDCARRERA=CD.IDCARRERA AND CD.IDDOCENTE=idDocente AND CD.ACTIVO=1)";
            query += " ON F.IDFACULTAD=C.IDFACULTAD";
            query += " WHERE F.ACTIVO=1";
            query += " ORDER BY F.NOMBRE";            
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Facultad f = new Facultad();
                f.setIdFacultad(rs.getInt("F.IDFACULTAD"));
                f.setNombre(rs.getString("F.NOMBRE"));
                f.setSigla(rs.getString("F.SIGLA"));
                facultades.add(f);
            }
        }catch(SQLException e){
            throw new DataException(" AdminFacultad -> getFacultadesPorDocente(int idDocente) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return facultades;
    }
}
